/**
 * 地图参数
 * key为地图类型: {
 *     getGeoJson: 地图数据加载
 * } 
 */
function decode(json) {
    if (!json.UTF8Encoding) {
        return json;
    }
    var features = json.features;

    for (var f = 0; f < features.length; f++) {
        var feature = features[f];
        var coordinates = feature.geometry.coordinates;
        var encodeOffsets = feature.geometry.encodeOffsets;

        for (var c = 0; c < coordinates.length; c++) {
            var coordinate = coordinates[c];

            if (feature.geometry.type === 'Polygon') {
                coordinates[c] = decodePolygon(
                    coordinate,
                    encodeOffsets[c]
                );
            } else if (feature.geometry.type === 'MultiPolygon') {
                for (var c2 = 0; c2 < coordinate.length; c2++) {
                    var polygon = coordinate[c2];
                    coordinate[c2] = decodePolygon(
                        polygon,
                        encodeOffsets[c][c2]
                    );
                }
            }
        }
    }
    // Has been decoded
    json.UTF8Encoding = false;
    return json;
}

function decodePolygon(coordinate, encodeOffsets) {
    var result = [];
    var prevX = encodeOffsets[0];
    var prevY = encodeOffsets[1];

    for (var i = 0; i < coordinate.length; i += 2) {
        var x = coordinate.charCodeAt(i) - 64;
        var y = coordinate.charCodeAt(i + 1) - 64;
        // ZigZag decoding
        x = (x >> 1) ^ (-(x & 1));
        y = (y >> 1) ^ (-(y & 1));
        // Delta deocding
        x += prevX;
        y += prevY;

        prevX = x;
        prevY = y;
        // Dequantize
        result.push([x / 1024, y / 1024]);
    }

    return result;
}

var mapParams = {
    'none': {
        getGeoJson: function(callback) {
            callback({
                type: 'FeatureCollection',
                features: [{
                    type: 'Feature',
                    geometry: {
                        coordinates: [],
                        encodeOffsets: [],
                        type: 'Polygon'
                    },
                    properties: {

                    }
                }]
            });
        }
    },
    'world': {
        getGeoJson: function(callback) {
            require(['./geoJson/world_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    'china': {
        getGeoJson: function(callback) {
            require(['./geoJson/china_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '南海诸岛': {
        textCoord: [126, 25],
        getPath: function(leftTop, scale) {
            // scale.x: width  = 10.51 : 64
            var pList = [
                [
                    [0, 3.5],
                    [7, 11.2],
                    [15, 11.9],
                    [30, 7],
                    [42, 0.7],
                    [52, 0.7],
                    [56, 7.7],
                    [59, 0.7],
                    [64, 0.7],
                    [64, 0],
                    [5, 0],
                    [0, 3.5]
                ],
                [
                    [13, 16.1],
                    [19, 14.7],
                    [16, 21.7],
                    [11, 23.1],
                    [13, 16.1]
                ],
                [
                    [12, 32.2],
                    [14, 38.5],
                    [15, 38.5],
                    [13, 32.2],
                    [12, 32.2]
                ],
                [
                    [16, 47.6],
                    [12, 53.2],
                    [13, 53.2],
                    [18, 47.6],
                    [16, 47.6]
                ],
                [
                    [6, 64.4],
                    [8, 70],
                    [9, 70],
                    [8, 64.4],
                    [6, 64.4]
                ],
                [
                    [23, 82.6],
                    [29, 79.8],
                    [30, 79.8],
                    [25, 82.6],
                    [23, 82.6]
                ],
                [
                    [37, 70.7],
                    [43, 62.3],
                    [44, 62.3],
                    [39, 70.7],
                    [37, 70.7]
                ],
                [
                    [48, 51.1],
                    [51, 45.5],
                    [53, 45.5],
                    [50, 51.1],
                    [48, 51.1]
                ],
                [
                    [51, 35],
                    [51, 28.7],
                    [53, 28.7],
                    [53, 35],
                    [51, 35]
                ],
                [
                    [52, 22.4],
                    [55, 17.5],
                    [56, 17.5],
                    [53, 22.4],
                    [52, 22.4]
                ],
                [
                    [58, 12.6],
                    [62, 7],
                    [63, 7],
                    [60, 12.6],
                    [58, 12.6]
                ],
                [
                    [0, 3.5],
                    [0, 93.1],
                    [64, 93.1],
                    [64, 0],
                    [63, 0],
                    [63, 92.4],
                    [1, 92.4],
                    [1, 3.5],
                    [0, 3.5]
                ]
            ];
            var str = '';
            var left = leftTop[0];
            var top = leftTop[1];
            for (var i = 0, l = pList.length; i < l; i++) {
                str += 'M ' + ((pList[i][0][0] * scale + left).toFixed(2) - 0) + ' ' + ((pList[i][0][1] * scale + top).toFixed(2) - 0) + ' ';
                for (var j = 1, k = pList[i].length; j < k; j++) {
                    str += 'L ' + ((pList[i][j][0] * scale + left).toFixed(2) - 0) + ' ' + ((pList[i][j][1] * scale + top).toFixed(2) - 0) + ' ';
                }
            }
            return str + ' Z';
        }
    },
    '新疆': {
        getGeoJson: function(callback) {
            require(['./geoJson/xin_jiang_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '西藏': {
        getGeoJson: function(callback) {
            require(['./geoJson/xi_zang_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '内蒙古': {
        getGeoJson: function(callback) {
            require(['./geoJson/nei_meng_gu_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '青海': {
        getGeoJson: function(callback) {
            require(['./geoJson/qing_hai_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '四川': {
        getGeoJson: function(callback) {
            require(['./geoJson/si_chuan_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '黑龙江': {
        getGeoJson: function(callback) {
            require(['./geoJson/hei_long_jiang_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '甘肃': {
        getGeoJson: function(callback) {
            require(['./geoJson/gan_su_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '云南': {
        getGeoJson: function(callback) {
            require(['./geoJson/yun_nan_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '广西': {
        getGeoJson: function(callback) {
            require(['./geoJson/guang_xi_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '湖南': {
        getGeoJson: function(callback) {
            require(['./geoJson/hu_nan_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '陕西': {
        getGeoJson: function(callback) {
            require(['./geoJson/shan_xi_1_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '广东': {
        getGeoJson: function(callback) {
            require(['./geoJson/guang_dong_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '吉林': {
        getGeoJson: function(callback) {
            require(['./geoJson/ji_lin_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '河北': {
        getGeoJson: function(callback) {
            require(['./geoJson/he_bei_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '湖北': {
        getGeoJson: function(callback) {
            require(['./geoJson/hu_bei_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '贵州': {
        getGeoJson: function(callback) {
            require(['./geoJson/gui_zhou_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '山东': {
        getGeoJson: function(callback) {
            require(['./geoJson/shan_dong_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '江西': {
        getGeoJson: function(callback) {
            require(['./geoJson/jiang_xi_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '河南': {
        getGeoJson: function(callback) {
            require(['./geoJson/he_nan_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '辽宁': {
        getGeoJson: function(callback) {
            require(['./geoJson/liao_ning_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '山西': {
        getGeoJson: function(callback) {
            require(['./geoJson/shan_xi_2_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '安徽': {
        getGeoJson: function(callback) {
            require(['./geoJson/an_hui_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '福建': {
        getGeoJson: function(callback) {
            require(['./geoJson/fu_jian_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '浙江': {
        getGeoJson: function(callback) {
            require(['./geoJson/zhe_jiang_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '江苏': {
        getGeoJson: function(callback) {
            require(['./geoJson/jiang_su_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '重庆': {
        getGeoJson: function(callback) {
            require(['./geoJson/chong_qing_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '宁夏': {
        getGeoJson: function(callback) {
            require(['./geoJson/ning_xia_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '海南': {
        getGeoJson: function(callback) {
            require(['./geoJson/hai_nan_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '台湾': {
        getGeoJson: function(callback) {
            require(['./geoJson/tai_wan_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '北京': {
        getGeoJson: function(callback) {
            require(['./geoJson/bei_jing_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '天津': {
        getGeoJson: function(callback) {
            require(['./geoJson/tian_jin_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '上海': {
        getGeoJson: function(callback) {
            require(['./geoJson/shang_hai_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '香港': {
        getGeoJson: function(callback) {
            require(['./geoJson/xiang_gang_geo'], function(md) {
                callback(decode(md));
            });
        }
    },
    '澳门': {
        getGeoJson: function(callback) {
            require(['./geoJson/ao_men_geo'], function(md) {
                callback(decode(md));
            });
        }
    }
};

var mapGeoData = {
    decode: decode,
    params: mapParams
};
